interface PadOption{
	char?:string;
	start?:boolean;
}
/**
 * 填充字符串
 * @param value			需要被填充的值
 * @param length		最小位数
 * @param [option]		选项
 * @return 填充后的值
 */
function pad(value:number|string,length:number,option?:PadOption):string{
	const {char='0',start=true}=option||{};
	const val=''+value;
	if(val.length>=length){
		return val;
	}else{
		let pad=char;
		for(let i=length-val.length-1;i>0;--i){
			pad+=char;
		}
		return start?pad+val:val+pad;
	}
}
/**
 * 字符串替换
 * @param {string} src		原始字符串
 * @param {string} search	搜索值
 * @param {string} replace	替换值
 * @return {string}
 */
function replaceStr(src:string,search:string,replace:string):string{
	let pos=0;
	let next=src.indexOf(search);
	let str='';
	while(next!==-1){
		str+=src.slice(pos,next)+replace;
		pos=next+search.length;
		next=src.indexOf(search,pos);
	}
	return str+src.slice(pos);
}
/**
 * 格式化金额
 * 把一个实数格式化为整数部分每3位数一个逗号分隔
 * @example
 * moneyFormat(12344567.126); //12,344,567
 * moneyFormat('12344567.126'); //12,344,567
 * moneyFormat(12344567.126,2); //12,344,567.13
 * moneyFormat('12344567.126',2); //12,344,567.13
 * @param {number|string} value		被格式化的实数
 * @param {number} [decimalDigits]	保留的小数位数
 * @return 格式化后的字符串
 */
function moneyFormat(value:number|string,decimalDigits?:number):string{
	if(typeof value==='string'){
		value=Number(value);
	}
	if(!isFinite(value)){
		return value+'';
	}
	value=value.toFixed(decimalDigits);
	const p=value.indexOf('.');
	if(p===-1){
		return integerMoneyFormat(value);
	}else{
		return integerMoneyFormat(value.slice(0,p))+value.slice(p);
	}
}
/**
 * 格式化金额的整数部分
 * @param {string} value	金额的整数部分
 * @return 格式化后的字符串
 */
function integerMoneyFormat(value:string):string{
	let pre='';
	if(value[0]==='-'){
		pre='-';
		value=value.slice(1);
	}
	const len=value.length;
	let pos=len%3||3;
	let str=value.slice(0,pos);
	while(pos<len){
		const next=pos+3;
		str+=','+value.slice(pos,next);
		pos=next;
	}
	return pre+str;
}
const storageUnit=[
	'B',
	'KB',
	'MB',
	'GB',
	'TB',
];
/**
 * 格式化存储数值
 * @param {number|string} size			比特数
 * @param {number} [threshold=1024]		转换阈值
 */
function storageFormat(size:number|string,threshold:number=1024):string{
	if(typeof size==='string'){
		size=Number(size);
	}
	let i=0;
	while(size>=threshold){
		size/=1024;
		++i;
	}
	return Math.round(size*100)/100+storageUnit[i];
}

export {
	//填充字符串
	pad,
	//字符串替换
	replaceStr,
	//格式化金额
	moneyFormat,
	//格式化存储数值
	storageFormat,
};
